import pymysql
#类方法使用类属性，cls.类属性
class DBUtil(object):#创建数据库连接和关闭是一样的，可以封装成2个方法
#为了方便调用，可以把方法都设置为类方法 加装饰器@classmethod,改self为cls
    conn = None
    @classmethod
    def __get_conn(cls):#创建和关闭连接不需要给用户使用，可以设置成私有方法
        #创建数据库连接
        #数据库不需要连接多次，可以加个判断是否为空
        if cls.conn is None:#为了conn不报红，定义一个类属性conn=None
            cls.conn = pymysql.connect(host="211.103.136.244", port=7061, user="student",
                       password="iHRM_student_2021", database="ihrm", charset="utf8")
        #返回数据库连接
        return cls.conn

    @classmethod
    def __colse_conn(cls):
        if cls.conn:
            cls.conn.close()
            cls.conn = None#关闭连接之后手动置空

    @classmethod
    def select_one(cls,sql):#sql使用参数传进来
        cursor = None
        result = None
        try:
            cls.__get_conn()#已经返回了cls.conn,不需要再写返回值
            #获取游标
            cursor = cls.conn.cursor()
            #执行sql语句
            cursor.execute(sql)
            result = cursor.fetchone()
        except Exception as e:
            print(e)
        finally:
            #关闭游标
            if cursor:
                cursor.close()
            #关闭连接,使用调用类方法
            cls.__colse_conn()
            return result

    @classmethod
    def uid(cls,sql):#sql用参数传
        cursor = None
        try:
            # 创建数据库连接
            cls.__get_conn()
            # 获取游标
            cursor = cls.conn.cursor()
            # 执行sql语句
            cursor.execute(sql)
            #提交事务
            cls.conn.commit()
        except Exception as e:
            print(e)
            cls.conn.rollback()
        finally:
            # 关闭游标
            if cursor:
                cursor.close()
            # 关闭连接
            cls.__colse_conn()

if __name__ == '__main__':
    data = DBUtil.select_one("SELECT * FROM  t_hero ;")
    print(data)
    DBUtil.uid("update t_hero set gender = 0 WHERE id = 11")
